//package com.gollum.jpa.spcification;
//
//import com.gollum.jpa.util.LambdaUtils;
//
//import javax.persistence.criteria.*;
//
///**
// * 添加函数
// *
// * @author Herther
// * @createTime 2022年10月15日 00:30:00
// * @since 1.0.0
// */
//public class ExpressionSpecification<T> extends AbstractSpecification<T>{
//    private final String property;
//    private final Object[] values;
//
//    private final String functionName;
//
//    public ExpressionSpecification(String functionName,String property, Object... values) {
//        this.functionName = functionName;
//        this.property = property;
//        this.values = values;
//    }
//
//    //@Override
//    //public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
//    //    Expression<Long> findInSetFun =
//    //            cb.function(functionName, Long.class, cb.literal(values), root.get(property));
//    //    return null;
//    //}
//
//    @Override
//    public Predicate toPredicate(Root<T> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
//        From from = getRoot(property, root);
//        String field = getProperty(property);
//        if (values == null) {
//            return cb.isNull(from.get(field));
//        }
//        if (values.length == 1) {
//            return getPredicate(from, cb, values[0], field);
//        }
//
//        Predicate[] predicates = new Predicate[values.length];
//        for (int i = 0; i < values.length; i++) {
//            predicates[i] = getPredicate(root, cb, values[i], field);
//        }
//        return cb.or(predicates);
//    }
//
//    private Predicate getPredicate(From root, CriteriaBuilder cb, Object value, String field) {
//        if (value == null){
//            cb.isNull(root.get(field));
//        }else{
//
//        }
//        Expression<Long> findInSetFun =
//                    cb.function(functionName, Long.class, cb.literal(values), root.get(property));
//        return  cb.isNull(root.get(field)) : cb.equal(root.get(field), value);
//    }
//}
